﻿using System;
using System.Collections.Generic;
using AutoMapper;
using CodeSaude.Application.Interfaces;
using CodeSaude.Application.ViewModels;
using CodeSaude.Domain.Entities;
using CodeSaude.Domain.Interfaces.Service;
using CodeSaude.Infrastructure.CrossCutting.Util;

namespace CodeSaude.Application.Services
{
    public class UsuarioApplicationService : BaseApplicationService,  IUsuarioApplicationService
    {
        private readonly IUsuarioService _usuarioService;

        public UsuarioApplicationService(IUsuarioService usuarioService)
        {
            _usuarioService = usuarioService;
        }

        //public ValidationApplicationResult Add(UsuarioViewModel usuarioViewModel)
        //{
        //    var usuario = Mapper.Map<UsuarioViewModel, Usuario>(usuarioViewModel);

        //    var result = _usuarioService.AdicionarUsuario(usuario);

        //    //if(result.IsValid)
        //        _usuarioService.SaveChanges();

        //    return Mapper.Map<ValidationResult, ValidationApplicationResult>(result);
        //}

        public void Add(UsuarioViewModel usuarioViewModel)
        {
            Usuario usuario = Mapper.Map<UsuarioViewModel, Usuario>(usuarioViewModel);
            
            usuario.Senha = CodeUtils.Encrypt("123456");
            usuario.FlagSenhaPadrao = 1;
            usuario.FlagAtualizado = 0;

            BeginTransaction();
            _usuarioService.AdicionarUsuario(usuario);
           Commit();
        }

        public UsuarioViewModel GetById(int id)
        {
            return Mapper.Map<UsuarioViewModel>(_usuarioService.GetById(id));
        }

        public IEnumerable<UsuarioViewModel> GetAll()
        {
            return Mapper.Map<IEnumerable<UsuarioViewModel>>(_usuarioService.GetAll());
        }

        public void Update(UsuarioViewModel usuarioViewModel)
        {
            var usuario = Mapper.Map<Usuario>(usuarioViewModel);// _usuarioService.GetById(usuarioViewModel.UsuarioId);
            usuario.Senha = usuarioViewModel.Senha;
            usuario.FlagSenhaPadrao = 0;
            usuario.FlagAtualizado = 1;
            BeginTransaction();
            _usuarioService.Update(usuario);
            Commit();
        }

        public void Remove(UsuarioViewModel usuarioViewModel)
        {
            var user = _usuarioService.GetById(usuarioViewModel.UsuarioId);
            BeginTransaction();
            _usuarioService.Remove(user);
            Commit();
        }

        public UsuarioViewModel GetByLogin(string login)
        {
            return Mapper.Map<UsuarioViewModel>(_usuarioService.BuscarPorLogin(login));
        }

        public void Dispose()
        {
            _usuarioService.Dispose();
        }
    }
}
